<?php
/*
 * 
 * 加密类
 * 
 */

namespace Model;

class Crypt
{
	private $_key = 'D9PkwK6CN'; 
	
	function encrypt($string,$key = '') 
	{
		$key .= $this->_key;
		$key = md5 ( $key );
		$key_length = strlen ( $key );
		$string = substr ( md5 ( $string . $key ), 0, 8 ) . $string;
		$string_length = strlen ( $string );
		$rndkey = $box = array ();
		$result = '';
		for($i = 0; $i <= 255; $i ++) 
		{
			$rndkey [$i] = ord ( $key [$i % $key_length] );
			$box [$i] = $i;
		}
		for($j = $i = 0; $i < 256; $i ++) 
		{
			$j = ($j + $box [$i] + $rndkey [$i]) % 256;
			$tmp = $box [$i];
			$box [$i] = $box [$j];
			$box [$j] = $tmp;
		}
		for($a = $j = $i = 0; $i < $string_length; $i ++) {
			$a = ($a + 1) % 256;
			$j = ($j + $box [$a]) % 256;
			$tmp = $box [$a];
			$box [$a] = $box [$j];
			$box [$j] = $tmp;
			$result .= chr ( ord ( $string [$i] ) ^ ($box [($box [$a] + $box [$j]) % 256]) );
		}
		return str_replace ( '=', '', base64_encode ( $result ) );
	}
	
	function decrypt($string, $key = '')
	{
		$key .= $this->_key;
		$key = md5 ( $key );
		$key_length = strlen ( $key );
		$string = base64_decode ( $string );
		$string_length = strlen ( $string );
		$rndkey = $box = array ();
		$result = '';
		for($i = 0; $i <= 255; $i ++) 
		{
			$rndkey [$i] = ord ( $key [$i % $key_length] );
			$box [$i] = $i;
		}
		for($j = $i = 0; $i < 256; $i ++) 
		{
			$j = ($j + $box [$i] + $rndkey [$i]) % 256;
			$tmp = $box [$i];
			$box [$i] = $box [$j];
			$box [$j] = $tmp;
		}
		for($a = $j = $i = 0; $i < $string_length; $i ++) {
			$a = ($a + 1) % 256;
			$j = ($j + $box [$a]) % 256;
			$tmp = $box [$a];
			$box [$a] = $box [$j];
			$box [$j] = $tmp;
			$result .= chr ( ord ( $string [$i] ) ^ ($box [($box [$a] + $box [$j]) % 256]) );
		}
		
		if (substr ( $result, 0, 8 ) == substr ( md5 ( substr ( $result, 8 ) . $key ), 0, 8 )) 
		{
			return substr ( $result, 8 );
		} 
	
		return '';
	}
	
	function singlEncrypt($string,$key = '')
	{
		$return = array();
		$return['key'] = $key;
		
		if(empty($key))
		{
			$rand = '0123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ';
			$length = 8;
			$max = strlen($rand) - 1;
			for($i = 0; $i < $length; $i++) {
				$return['key'] .= $rand[mt_rand(0, $max)];
			}
		}
		
		$return['encrypt'] = md5(md5(trim($string)).$return['key'].$this->_key);
		
		return empty($key)?$return:$return['encrypt'];
	}
}

?>
